package com.silence.basic_learn;

import java.io.*;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class HelloWorld {
    public static void main(String[] args) throws IOException, ParseException {  // ParseException用于异常
//        System.out.println(0141);
//        System.out.println(0xFA);
//
//        int a = 22;
//        byte b = (byte) a;
//        System.out.println(b);
//        System.out.println(a++);
//        System.out.println(++a);
//
//        int c = 10;
//        int d = 5;
//        int rs3 = c++ + ++c - --d + 1 + c--;
//        System.out.println(rs3); //10 + 12 - 4 + 1 + 12 = 31
//        System.out.println(c); //11
//        System.out.println(d); //4

//        System.out.println("--------------------");
//        int left = 10;
//        int right = 10;
//        System.out.println(++left <= 10 && ++right > 10);
//        System.out.println(left);
//        System.out.println(right);

        // ------输入------
        Scanner scan = new Scanner(System.in);
//        System.out.println("请输入想聊天的人：");
//        String a = sc.next();
//        System.out.println(a+"你好");

        // ------while------
//        int high = 8848860;
//        double paper = 0.1;
//        int num = 0;
//        Random r = new Random();
//        int nothing = r.nextInt(10,30);
//        while (paper < high) {
//            paper *= 2;
//            num++;
//        }
//        System.out.println(num);
//        System.out.println(paper);

        // ------静态初始化数组------
//        int[] ages = {1,2,3}; //静态初始化数组
//        double scores[] = {100,120,140}; // 中括号建议放在数据类型后面
//        char[] names = new char[]{'a','b','c'};
//        for (int i = 0; i < names.length; i++) {
//            System.out.println(names[i]);
//        }

        // ------动态初始化数组------
//        double[] scores = new double[6];//动态初始化数组
//        double sum = 0;
//        for (int i = 0; i < scores.length; i++) {
//            Scanner sc = new Scanner(System.in);
//            double score = sc.nextDouble();
//            scores[i] = score;
//            sum+=score;
//        }
//        System.out.println("average score is " + sum/scores.length);

        //------方法------
//        System.out.println("func sum :" + sum(100, 130));
//        v_sum(200,100);

        //------值传递和引用类型传递------
//        int[] arr = {10,20,30};
//        arr_change(arr);
//        System.out.println(arr[0]);

        //------面向对象编程------
//        Student s1 = new Student();//创建一个学生对象，封装小明的数据
//        s1.name = "小明";
//        s1.chinese = 70;
//        s1.math = 100;
//        s1.printTotalScore();
//        s1.printAverageScore();
//        s1.compare();
//        Student s2 = new Student("小红",80,80);
//        s2.printTotalScore();

        //封装
//        Student s3 = new Student();
//        s3.setScore(89);
//        System.out.println(s3.getScore());

        //实体类
//        Teacher t1 = new Teacher();
//        t1.setName("王老师");
//        t1.setWork(77);
//        TeacherOperator t1o = new TeacherOperator(t1);
//        t1o.printPass();
//        Teacher t2 = new Teacher("李老师", 55);
//        TeacherOperator t2o = new TeacherOperator(t2);
//        t2o.printPass();

        //ArrayList
//        ArrayList<String> list = new ArrayList<>();
//        list.add("1");
//        list.add("2");
//        list.add("3");
//        list.add("3");
//        list.add("b");
//        list.add("3");
//        list.add(1, "a");
//        System.out.println(list);
//        for (int i = 0; i < list.size(); i++) {
//            String a = list.get(i);
////            System.out.println(list.get(i));
//            if (a.contains("3")) {
//                list.remove(i);
//                i--;
//            }
//        }
//        System.out.println(list);

        //static、继承、封装
//        Student s1 = new Student();
//        Student s2 = new Student();
//        Student s3 = new Student();
//        System.out.println(s1);
//        System.out.println(Student.StudentNum); // 类变量
//        System.out.println(Student.getStudentNum()); // 类方法
//        System.out.println(SCHOOL_HELLO);

        //Arrays
//        int[] arr = new int[]{0,1,2,3,4,5,6,7,8,9};
//        // 展示数组内容
//        System.out.println(Arrays.toString(arr));
//
//        int[] arr1 = Arrays.copyOfRange(arr, 4, 7);
//        System.out.println(Arrays.toString(arr1));
//
//        Arrays.setAll(arr, new IntUnaryOperator() {
//            @Override
//            public int applyAsInt(int operand) {
//                // 取 0，1，2...... 索引
//                return arr[operand] * 100;
//            }
//        });

        //对象自定义排序
//        Student[] sarr = new Student[3];
//        sarr[0] = new Student("小红",80,80);
//        sarr[1] = new Student("小兰",90,70);
//        sarr[2] = new Student("小李",70,100);
//        Arrays.sort(sarr, new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
////                return Double.compare(o1.math,o2.math); // 升序
//                return Double.compare(o2.math,o1.math); // 降序
//
//            }
//        });
//        //简化
//        Arrays.sort(sarr,(o1,o2)->Double.compare(o2.math,o1.math));
//        System.out.println(Arrays.toString(sarr));

        //正则表达式
//        String a = scan.next();
        // 要求：判断第一位必须是1-9，且只能是数字，总共6-20位之间
        //[1-9]表示这一位只能是1-9
        // \d表示数字0-9，因为\特殊用途，所以需要转义，用\\
        // \\D{5，19}表示只能是0-9的数字的长度是5-19
        //总共第一位+5-19 就是 6-20位
//        System.out.println(a.matches("[1-9]\\d{5,19}"));

        //集合，单列集合Collection
//        Collection<String> c = new ArrayList<>();
//        c.add("123");//添加
//        c.clear();//清空
//        c.add("aaa");
//        c.add("qq");
//        c.add("ww");
//        c.add("ee");
//        boolean isempty = c.isEmpty();//判空
//        int size = c.size();//集合大小
//        boolean contains = c.contains("qq"); //判断存在
//        c.remove("qq"); //删除，多个重复删除前面第一个
//
//        Object[] cc = c.toArray(); //转数组，数组的形式必须是Object，兼容任意数据
//        String[] ccc= c.toArray(new String[c.size()]); //一定要String可以这样
//
//        Collection<String> c2 = new ArrayList<>();
//        c2.add("rrr");
//        c.addAll(c2); // c2中全部数据导入c集合中，必须同类型，是拷贝了一份倒入
//        System.out.println(c);
        // 迭代器对象，指向第一个元素
//        Iterator<String>ci = c.iterator();
//        System.out.println(ci.next());
//        System.out.println(ci.next());
//        System.out.println(ci.next());
//        System.out.println(ci.next());
//        System.out.println(ci.next()); //报错NoSuchElementException

        //迭代器结合循环
//        while(ci.hasNext()){
//            System.out.println(ci.next());
//        }
        //增强for
//        for (String s : c) {
//            System.out.println(s);
//        }

        //lambda
//        c.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
//        c.forEach(s -> { // 简化
//            System.out.println(s);
//        });
//        c.forEach(s -> System.out.println(s)); // 简化
//        c.forEach(System.out::println); // 最简化

        //队列
//        LinkedList<String> queue = new LinkedList<>();
//        queue.addLast("one"); //入队
//        queue.addLast("two"); //入队
//        queue.addLast("three"); //入队
//        queue.addLast("four"); //入队
//        System.out.println(queue);
//
//        queue.removeFirst(); // 出队
//        queue.removeFirst(); // 出队
//        System.out.println(queue);

        //栈
//        LinkedList<String > stack = new LinkedList<>();
//        stack.addFirst("first"); // 进栈
//        stack.addFirst("second");
//        stack.addFirst("third");
//        stack.push("fourth");
//        stack.push("fifth");
//        System.out.println(stack);
//
//        System.out.println(stack.removeFirst()); // 出栈
//        System.out.println(stack.pop()); // 出栈
//        System.out.println(stack);

        //Set集合
//        Set<Integer> set = new HashSet<>();
//        set.add(9);
//        set.add(9);
//        set.add(2);
//        set.add(4);
//        set.add(3);
//        System.out.println(set);

        //collections
//        List<Integer> list = new ArrayList<>();
//        Collections.addAll(list,1,5,76,2,4,65);
//        Collections.sort(list, new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return Double.compare(o2,o1); // 倒序
//            }
//        });
//        System.out.println(list);

        //Map
//        Map<String,Integer> treeMap= new TreeMap<>();
//        treeMap.put("computer",7299);
//        treeMap.put("clock",300);
//        treeMap.put("clothes",400);
//        treeMap.put("Java",99);
//        System.out.println(treeMap);
//        System.out.println(treeMap.get("Java"));
//        System.out.println(treeMap.get("Python")); // 键不存在返回null
//        treeMap.put("Python",69);
//        treeMap.remove("Python");
//        System.out.println(treeMap.containsKey("java"));
//        System.out.println(treeMap.containsValue(7299));
//
//        Set<String> hashSet = treeMap.keySet();
//        System.out.println(hashSet);
//
//        Collection<Integer> collection = treeMap.values();
//        System.out.println(collection);
//
//        Map<String ,Integer> hashMap = new HashMap<>();
//        hashMap.put("happy",0);
//        hashMap.put("sad",0);
//        treeMap.putAll(hashMap); //后面集合全部元素倒入前面集合中去，覆盖
//        System.out.println(treeMap);

        //Map以键值对遍历
//        Map<String,Double> map = new HashMap<String,Double>();
//        map.put("qqq",100.0);
//        map.put("www",90.0);
//        map.put("eee",80.0);
//        Set< Map.Entry<String, Double> > entries = map.entrySet();
//        for (Map.Entry<String, Double> entry : entries) {
//            System.out.print(entry.getKey());
//            System.out.print("--->");
//            System.out.println(entry.getValue());
//
//        }

        //Map以Lambda表达式遍历
//        map.forEach((k,v)->{
//            System.out.println(k+"-->"+v);
//        });

        //模拟景点选择
//        List<String> data = new ArrayList<>();
//        String[] selects = {"A", "B", "C", "D"};
////        Random r = new Random();
//        for (int i = 1; i <= 37; i++) { //随机生成选择的80个景点
//            int index = (int) (Math.random() * 4);
//            data.add(selects[index]);
//        }
//        Map<String,Integer> result = new HashMap<>();
//        for (String s : data) {
//            if(result.containsKey(s)){
//                result.put(s,result.get(s)+1);
//            }else{
//                result.put(s,1);
//            }
//        }
//        System.out.println(result);

        //HashMap,treeMap, linkedmap
//        new HashSet<>();// hashset也是创建了一个hashmap，只是不用值，只用键
//        new LinkedHashSet<>(); // linkedhashset其实就是linkedHashmap的底层原理
//        new TreeSet<>(); //treemap一样底层原理

        //HashMap排序
//        Map<Integer,Integer> treeMap = new TreeMap<>((o1,o2)-> Double.compare(o2,o1));
//        treeMap.put(2,3);
//        treeMap.put(8,3);
//        treeMap.put(4,3);
//        treeMap.put(6,3);
//        System.out.println(treeMap);

        //集合的嵌套
//        Map<String,List<String>> citys = new HashMap<>();
//        List<String> city1 = new ArrayList<>();
//        Collections.addAll(city1,"南京市","扬州市","苏州市","无锡市","常州市");
//        citys.put("江苏省",city1);
//        List<String> city2 = new ArrayList<>();
//        Collections.addAll(city2,"武汉市","孝感市","十堰市","宜昌市","鄂州市");
//        citys.put("湖北省",city2);
//        System.out.println(citys);
//        List<String> now_city = citys.get("江苏省");
//        for (String s : now_city) {
//            System.out.println("江苏省有"+s);
//        }

        //Stream流
//        Map<String,Integer> map = new HashMap<>();
//        map.put("卡特琳娜",99);
//        map.put("卡兹克",88);
//        map.put("卡莎",77);
//        map.put("金克斯",66);
//        map.put("锐雯",55);
//        Set<Map.Entry<String,Integer>> entries =  map.entrySet();
//        Stream<Map.Entry<String,Integer>> kvm=entries.stream();
//        Map<String,Integer> map2 = new HashMap<>();
//        kvm.filter(k -> k.getKey().contains("卡")).forEach(e -> map2.put(e.getKey(),e.getValue()));
//        System.out.println(map2);

        //Stream中间方法
//        List<Student> students = new ArrayList<>();
//        Student s1 = new Student("小倩",100,100);
//        Student s2 = new Student("小兰",80,80);
//        Student s3 = new Student("小周",60,120);
//        Student s4 = new Student("小琳",120,70);
//        Student s5 = new Student("小红",90,90);
//        Collections.addAll(students,s1,s2,s3,s4,s5);
//        //两门课都至少80分，并且按数学分数降序排序,选择前2名学生
//        students.stream().filter(s ->s.math>=80 && s.chinese>=80).sorted( (o1,o2) -> Double.compare(o2.math,o1.math) ).limit(2).forEach(System.out::println);
//        //输出数学最高的同学
//        System.out.println(students.stream().max((a,b) -> Double.compare(b.math,a.math)).get());

        //abstract
//        Animal dog = new Dog();
//        dog.setName("小白");
//        dog.sound();
//        dog.fav_food();

        //包装类
//        String a1 = "28.1";
//        int a2 = Integer.valueOf(a1);
//        System.out.println(a2);

        //StringBuilder或者StringBuffer
//        StringBuffer s = new StringBuffer("2月28日");
//        s.append(12);
//        s.append(true).append("hello");
//        s.reverse();
//        System.out.println(s);
//        for (int i=1;i<=1000000;i++){
//            s.append("abc"); //用String就会特别特别慢
//        }
//        System.out.println(s);

        //StringJoiner
//        StringJoiner sj = new StringJoiner(", " ,"[","]");
//        sj.add("hello").add("ok").add("yes");
//        System.out.println(sj);

        //Math
//        long time1 = System.currentTimeMillis();
//        System.out.println( Math.ceil(-1.0/3.0) );
//        System.out.println( Math.floor(1.0/-3.0) );
//        System.out.println( Math.round(1.0/3.0) );
//        System.out.println(Math.sqrt(3));
//        long time2 = System.currentTimeMillis();
//        System.out.println(time2-time1);

        //Runtime单例对象
//        Runtime r = Runtime.getRuntime();
//        System.out.println(r.totalMemory()/1024/1024+"MB");
//        System.out.println(r.freeMemory()/1024/1024+"MB");
//        r.exec("");

        //BigDecimal
//        double a = 0.1;
//        double b = 0.2;
//        System.out.println(a+b);
//        BigDecimal a1 = BigDecimal.valueOf(a);
//        BigDecimal b1 = new BigDecimal(Double.toString(b));
//        BigDecimal c1 = a1.add(b1);
//        System.out.println(c1);
//        BigDecimal k1 = a1.divide(c1,2,BigDecimal.ROUND_HALF_UP);
//        System.out.println(k1);
//        String aa = "1111111111111111111111111111111111111111111";
//        BigDecimal a1 = new BigDecimal(aa);
//        BigDecimal a2 = scan.nextBigDecimal();
//        BigDecimal a3 = a1.add(a2);
//        System.out.println(a3);


        //Date
//        Date date = new Date();
//        long time = date.getTime();
//        time+= 600* 1000;
//        Date date1 = new Date();
//        date1.setTime(time);
//        System.out.println(date1);

        //SimpleDateFormat格式化时间
//        Date d = new Date();
//        long time = d.getTime();
//        System.out.println(d);
//        System.out.println(time);
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E a");
//        String gs = sdf.format(time);
//        System.out.println(gs);
//        String dateStr = "2019-02-28 12:12:12";
//        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date d2 = sdf2.parse(dateStr);
//        System.out.println(d2);
//        String dateStr2 = "2019年11月19日 11:11:11";
//        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//        Date d3 = sdf3.parse(dateStr2);
//        System.out.println(d2.getTime() > d3.getTime()); //  false

        //Calendar
//        Calendar now = Calendar.getInstance();
//        System.out.println(now);
//        int dayofyear = now.get(Calendar.DAY_OF_YEAR);
//        System.out.println(dayofyear);
//        Date now_date = now.getTime();
//        System.out.println(now_date);
//        now.set(Calendar.MONTH,1);
//        now.set(Calendar.YEAR,1999);
//        now.set(Calendar.DAY_OF_MONTH,1);
//        System.out.println(now);
//        now.add(Calendar.DAY_OF_YEAR,-10000); // 其他数据会随之改变
//        System.out.println(now);

        //localDate
//        LocalDate ld = LocalDate.now();
//        LocalDate ld2 = ld.withDayOfYear(228);
//        System.out.println(ld2);

        //ZoneID,ZoneDateTime
//        ZoneId zoneId = ZoneId.systemDefault();
//        System.out.println(ZoneId.getAvailableZoneIds());
//        ZoneId zoneId1 = ZoneId.of("America/New_York");
//        ZonedDateTime now = ZonedDateTime.now(zoneId1);
//        System.out.println(now);
//        System.out.println(ZonedDateTime.now(Clock.systemUTC()));

        //SimpleDateFormat
        //1、创建一个日期时间格式化对象
//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分ss秒");
        //2、对时间进行格式化
//        LocalDateTime now = LocalDateTime.now();
//        String rs = formatter.format(now); // 正向格式化，用格式化器格式化时间
//        System.out.println(rs);
//        String rs2 = now.format(formatter); // 反向格式化，用自己的格式化方法
//        System.out.println(now);

        //解析时间
//        String date = "12-30-2020 18:12:12";
//        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss");
//        LocalDateTime ldt = LocalDateTime.parse(date,formatter2);
//        System.out.println(ldt);
//
//
//        LocalDateTime localDateTime = LocalDateTime.of(2020,1,1,10,10,10);
//        System.out.println(localDateTime);


        //Queue
//        Queue<Integer> p_queue = new PriorityQueue<>((o1, o2) -> o2 - o1);
//        p_queue.add(2);
//        p_queue.add(22);
//        p_queue.add(-200);
//        p_queue.add(39);
//        p_queue.poll();  //检索并删除队列的头部
//        System.out.println(p_queue);

        //Stack
//        Stack<Integer> stack = new Stack<>();
//        stack.add(33);
//        stack.add(99);
//        stack.add(333);
//        stack.add(3333);
//        System.out.println(stack.peek());

        //枚举
//        ENUM_A a1 = ENUM_A.Y;
//        System.out.println(a1);
//
//        ENUM_A[] enum_arr = ENUM_A.values();
//        System.out.println(enum_arr);
//        System.out.println(a1.ordinal()); // 索引

        // 异常
        // main函数 throws ParseException 的时候，会将异常抛给JVM处理，也是try-catch
//        try {  // 监视
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date d = sdf.parse("2028-11-11 10:24");
//        System.out.println(d);
//        } catch (ParseException e) {
//            throw new RuntimeException(e);
//        }

        //编码解码
//        String data = "a我b";
//        byte[] bytes = data.getBytes("GBK"); // 默认平台字符集进行编码
////        System.out.println(Arrays.toString(bytes));
//        System.out.println(new String(bytes, "GBK"));

        //IO
//        try (
//                InputStream is = new FileInputStream("C:\\Users\\11320\\Desktop\\研\\Personal\\fun\\521.png");
//                OutputStream os = new FileOutputStream("C:\\Users\\11320\\Desktop\\研\\Personal\\fun\\520.png");
//
//        ) {
//            byte[] buffer = new byte[1024];
//            int len;
//            int time = 0;
//            while (time < 1000) {
//                os.write(buffer, 0, is.read(buffer));
//                time++;
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        // 特殊文件、日志
        // properties
        // 读取
        Properties properties = new Properties();
        properties.load(new FileReader("helloworld-app\\src\\com\\silence\\users.properties"));
        Set<String> keys = properties.stringPropertyNames();
        properties.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
        // 存
        Properties properties1 = new Properties();
        properties1.setProperty("hello", "12345678");
        properties1.setProperty("java", "321");
        properties1.store(new FileWriter("helloworld-app\\src\\com\\silence\\users_new.properties"), "save three users");

        // XML
        // ...

        // 日志 Logback
        // ...

        // 线程


    }

    public static final int SCHOOL_HELLO = 999;

    public static int sum(int a, int b) {
        return a + b;
    }

    public static void v_sum(int a, int b) {
        System.out.println(a + b);
    }

    public static void arr_change(int[] a) {
        System.out.println(a[0]);
        a[0] = 100;
        System.out.println(a[0]);
    }
}
